# 【练习】英雄游戏
# 定义一个英雄类，此英雄类需要包含 姓名、 血量、 攻击力、 还需要有一个方法为讲台词。
# 1. 根据英雄类，实例化不同的英雄对象。 2. 每个英雄需要在实例化的时候，就有自己的姓名、攻击力、血量

# 需求：每个英雄的血量不可以直接被获取或者修改。

# 需求1： 1. 现在除了英雄类，还有一种类是法师类。 1. 法师类继承于 Hero 类。 1. 法师类多了魔力的属性 1. 法师类多了一个放技能的方法。
# 需求2： 1. 定义战士类。 1. 战士类继承于Hero类。 1. 战士的会多一个护甲的属性。 1. 战士在初始化的时候需要多传入一个护甲信息。

# 需求： 1. 定义一个单独的 fight 函数。 1. 在打斗之前，需要两个英雄先讲出台词。 1. 这个fight函数要求实现两个英雄的多轮回合制对打功能。最后需要返回一个赢家。
# 1. 创建一个测试用例文件，导入被测函数，并对它完成单元测试。
class Hero:     # 英雄
    def __init__(self,name,hp,atk):
        self.name = name
        self.__hp = hp
        self.atk = atk
    def Lines(self):
        return f"台词:我叫{self.name}"

    def Get_hp(self):
        return self.__hp

class Master(Hero):     # 法师
    def __init__(self,name,hp,atk,mp):
        super().__init__(name,hp,atk)
        self.mp = mp
    def Put_skill(self):
        if self.mp >= 50:
            self.mp -= 50
            return 200      # 有蓝量放技能，造成200点伤害
        else:
            return self.atk     # 蓝量不足，伤害是攻击力

class Warrior(Hero):     # 战士
    def __init__(self,name,hp,atk,armor):
        super().__init__(name,hp,atk)
        self.armor = armor

def Fight(Master,Warrior):
    print(Master.Lines())
    print(Warrior.Lines())

    master_hp = Master.Get_hp()
    waster_hp = Warrior.Get_hp()

    while(True):
        if master_hp == 0 and waster_hp == 0:
            return "平局!"
        elif master_hp <= 0:
            return f"{Warrior.name}胜利!"
        elif waster_hp <= 0:
            return f"{Master.name}胜利!"
        else:
            waster_hp = waster_hp - (Master.Put_skill() - Warrior.armor)
            master_hp -= Warrior.atk


if __name__ == "__main__":
    master = Master("法师111",2000,100,80)
    warrior = Warrior("战士222",3000,80,20)

    print(Fight(master, warrior))
